import { NgModule, ModuleWithProviders } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { RouterModule, RouteReuseStrategy } from '@angular/router';

import { NgZorroAntdExtraModule } from 'ng-zorro-antd-extra';
import { AlainThemeModule } from '@delon/theme';
import { AlainABCModule, SimpleTableConfig, ReuseTabService, ReuseTabStrategy, FullContentService, XlsxService, DA_XLSX_CONFIG, LazyService } from '@delon/abc';
import { AlainACLModule } from '@delon/acl';

// third libs
import { CountdownModule } from 'ngx-countdown';

// i18n
import { TranslateModule } from '@ngx-translate/core';
import { I18NService } from '@core/i18n/i18n.service';

// 第三方插件
import { TreeModule } from 'ng2-tree';
import { NzTreeModule } from 'ng-tree-antd';

import { SidebarComponent } from './../layout/default/sidebar/sidebar.component';


// region: zorro modules
import {
    // LoggerModule,
    // NzLocaleModule,
    NzButtonModule,
    NzAlertModule,
    NzBadgeModule,
    // NzCalendarModule,
    // NzCascaderModule,
    NzCheckboxModule,
    NzDatePickerModule,
    NzFormModule,
    NzInputModule,
    // NzInputNumberModule,
    NzGridModule,
    NzMessageModule,
    NzModalModule,
    NzNotificationModule,
    NzPaginationModule,
    NzPopconfirmModule,
    NzPopoverModule,
    NzRadioModule,
    NzRateModule,
    NzSelectModule,
    NzSpinModule,
    // NzSliderModule,
    // NzSwitchModule,
    NzProgressModule,
    NzTableModule,
    NzTabsModule,
    NzTagModule,
    NzTimePickerModule,
    NzUtilModule,
    // NzStepsModule,
    NzDropDownModule,
    NzMenuModule,
    NzBreadCrumbModule,
    NzLayoutModule,
    NzRootModule,
    // NzCarouselModule,
    // NzCardModule,
    // NzCollapseModule,
    NzTimelineModule,
    // NzToolTipModule,
    // NzBackTopModule,
    // NzAffixModule,
    // NzAnchorModule,
    NzAvatarModule,
    // SERVICES
    NzNotificationService,
    NzMessageService
} from 'ng-zorro-antd';
const ZORROMODULES = [
    // LoggerModule,
    // NzLocaleModule,
    NzButtonModule,
    NzAlertModule,
    NzBadgeModule,
    // NzCalendarModule,
    // NzCascaderModule,
    NzCheckboxModule,
    NzDatePickerModule,
    NzFormModule,
    NzInputModule,
    // NzInputNumberModule,
    NzGridModule,
    NzMessageModule,
    NzModalModule,
    NzNotificationModule,
    NzPaginationModule,
    NzPopconfirmModule,
    NzPopoverModule,
    NzRadioModule,
    NzRateModule,
    NzSelectModule,
    NzSpinModule,
    // NzSliderModule,
    // NzSwitchModule,
    NzProgressModule,
    NzTableModule,
    NzTabsModule,
    NzTagModule,
    NzTimePickerModule,
    NzUtilModule,
    // NzStepsModule,
    NzDropDownModule,
    NzMenuModule,
    NzBreadCrumbModule,
    NzLayoutModule,
    NzRootModule,
    // NzCarouselModule,
    // NzCardModule,
    // NzCollapseModule,
    NzTimelineModule,
    // NzToolTipModule,
    // NzBackTopModule,
    // NzAffixModule,
    // NzAnchorModule,
    NzAvatarModule
];
// endregion

// region: @delon/abc modules
import {
    // AdSimpleTableModule,
    // AdReuseTabModule,
    // AdAvatarListModule,
    // AdChartsModule,
    // AdCountDownModule,
    // AdDescListModule,
    // AdEllipsisModule,
    // AdErrorCollectModule,
    AdExceptionModule,
    // AdFooterToolbarModule,
    // AdGlobalFooterModule,
    AdNoticeIconModule,
    // AdNumberInfoModule,
    AdProHeaderModule,
    // AdResultModule,
    AdSidebarNavModule,
    // AdStandardFormRowModule,
    // AdTagSelectModule,
    // AdTrendModule,
    // AdDownFileModule,
    // AdImageModule,
    // AdUtilsModule,
    AdFullContentModule,
    // AdXlsxModule
} from '@delon/abc';
const ABCMODULES = [
    // AdSimpleTableModule,
    // AdReuseTabModule,
    // AdAvatarListModule,
    // AdChartsModule,
    // AdCountDownModule,
    // AdDescListModule,
    // AdEllipsisModule,
    // AdErrorCollectModule,
    AdExceptionModule,
    // AdFooterToolbarModule,
    // AdGlobalFooterModule,
    AdNoticeIconModule,
    // AdNumberInfoModule,
    AdProHeaderModule,
    // AdResultModule,
    AdSidebarNavModule,
    // AdStandardFormRowModule,
    // AdTagSelectModule,
    // AdTrendModule,
    // AdDownFileModule,
    // AdImageModule,
    // AdUtilsModule,
    AdFullContentModule,
    // AdXlsxModule
];
// endregion

@NgModule({
    imports: [
        CommonModule,
        FormsModule,
        RouterModule,
        ReactiveFormsModule,
        HttpClientModule,
        ...ZORROMODULES,
        NgZorroAntdExtraModule.forRoot(),
        // theme
        AlainThemeModule.forChild(),
        // abc
        AdProHeaderModule.forRoot(),
        ...ABCMODULES,
        AlainACLModule.forRoot(),
        // third libs
        CountdownModule,
        TreeModule,
        NzTreeModule,
    ],
    exports: [
        CommonModule,
        FormsModule,
        ReactiveFormsModule,
        RouterModule,
        ...ZORROMODULES,
        NgZorroAntdExtraModule,
        AlainThemeModule,
        ...ABCMODULES,
        AlainACLModule,
        // i18n
        TranslateModule,
        // third libs
        CountdownModule,
        TreeModule,
        NzTreeModule,
        SidebarComponent
    ],
    declarations: [
        SidebarComponent
    ]
})
export class SharedModule {
    static forRoot(): ModuleWithProviders {
        return {
            ngModule: SharedModule,
            providers: [
                // ng-zorro-antd Services
                NzNotificationService,
                NzMessageService,
                // @delon/abc
                SimpleTableConfig,
                FullContentService,
                // reuse-tab
                ReuseTabService,
                { provide: RouteReuseStrategy, useClass: ReuseTabStrategy, deps: [ReuseTabService] },
                // xlsx
                XlsxService,
                { provide: DA_XLSX_CONFIG, useValue: {} },
                // utils
                LazyService
            ]
        };
    }
}
